
// undefined 既是一个原始数据类型，也是一个原始值数据
// undefined 全局对象上的一个属性  window.undefined

// console.log(window)
// console.log(window.undefined)

// 不可写 writable: false
// window.undefined = 1

// console.log(window.undefined)

// 不可配置 configurable: false
// delete window.undefined

// console.log(window.undefined)

// 不可枚举 enumerable: false
// for (let k in window) {
//   if (k === undefined) console.log(k)
// }


// 不可重新定义 Cannot redefine property: undefined
// Object.defineProperty(window, 'undefined', {
//   writable: true,
//   enumerable: true,
//   configurable: true
// })

// var a;
// 系统会给一个未赋值的变量自动赋值为undefined，类型也是undefined
// console.log(a)

// console.log(typeof a)


// function test(a) {
  // console.log(typeof a) // undefined
  // 当形参未传递的时候 会默认赋值为 undefined
  // return a; // undefined
// }

// console.log(test())


// function test() {
//   console.log(123)
  
//   // 函数内部没有显示返回一个值的时候，系统会默认返回undefined
// }

// console.log(test())


// var undefined = 1 // 这样赋值相当于 window.undefined = 1

// console.log(undefined) // 全局作用域下 无法定义 undefined 为 变量
// console.log(window.undefined)

// 'use strict' // 严格模式下在局部作用域下 也能当作变量名称

// function test() {
//   // 局部作用域下 可以定义undefined 为变量，要尽量避免
//   // undefined 不是JS的保留字和关键字(标识符)
//   var undefined = 1

//   console.log(undefined)
//   console.log(window.undefined)
// }
// test()


// var a;
// var a = null;

// // a === undefined ==> null === undefined // false
// if (a == undefined) { // true
//   console.log(true)
// } else {
//   console.log(false)
// }


// var a ;

// if (typeof a === 'undefined') { // true
//   console.log(true)
// } else {
//   console.log(false)
// }

// console.log(typeof b) // undefined 类型 未定义


// var a ;

// if ('a' in window) {
//   console.log(true)
// } else {
//   console.log(false)
// }



// void(0) -> 对0进行求值(无意义) 返回undefined
// 比window 省去一个去外部window取undefined的过程，是直接返回 undefined

// var a, b, c;

// a = void(b = 1, c = 2); // 对a 赋值 undefined

// console.log(a, b, c) // undefined 1 2

// <a href="javascript:;" />
// <a href="javascript:void(0)" /> // 阻止跳转 javascript:void(0):伪协议

// console.log(void 0 === window.undefined) // true


function test() {
  var undefined = 1;

  console.log(undefined); // 1
  console.log(void 0); // undefined
  console.log(window.undefined === void 0); // true
  console.log(undefined === void 0) // false
}
test()
